package com.linkai.JUC._06_assist;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @Description: 辅助类：CyclicBarrier 的使用：加法计数器
 *              原理：允许一组线程全等待彼此达到共同屏障点的同步辅助。
 * @Author: 林凯
 * @Date: 2021/10/24 15:51
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        // 及其7颗龙珠召唤神龙
        // 这里尝试设置了 7，说明要有7个线程执行 await 之后，里面的回调方法才会执行。
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
            System.out.println("召唤神龙成功！");
        });

        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(()->{
                // lambda 表达式里面本质是 new 了一个类，不能直接使用外面的 i
                System.out.println(Thread.currentThread().getName() + "收集了" + temp + "颗龙珠");
                try {
                    cyclicBarrier.await();  // 等待计数器加完之后，才会继续执行
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                // 召唤神龙之后，才会继续执行
                System.out.println(temp);
            }).start();
        }
//        try {
//            cyclicBarrier.await();  // 等待计数器加完之后，才会继续执行
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        } catch (BrokenBarrierException e) {
//            e.printStackTrace();
//        }


    }
}
